import { defineStore } from 'pinia'
import { userKye } from './keys'

// 类型约束
interface IUserState {
  menus: IMenuModel[],
  username: string,
}
type menu = IMenuModel & { children?: IMenuModel[] }; //交叉类型/类型并合: 二维数组

// pinia
export const useUserStore = defineStore(userKye, {
  state(): IUserState {
    return {
      menus: [], //返回的数据 在路由守卫中请求并赋值
      username: "", //用户名
    };
  },
  getters: {
    routes() {
      let menus: menu[] = []; //此变量menus: 自定义
      // 将请求回来的数组处理成二维数组
      menus = this.menus
        // 过滤出一级
        .filter((item) => item.parentId === 0)
        // 解构对象数组返回给menus
        .map((item) => ({
          ...item,
          children: [],
        }));
      // 从原有的数据过滤出来二级 加入到一级的children
      this.menus.forEach((sub) => {
        // 找到 menus 相等的 id, 就是上级
        const old = menus.find((item) => item.id === sub.parentId);
        // 如果找到了上级 加入到 children 里形成二维数组
        if (old && sub.hidden === 0) {
          old.children?.push(sub);
        }
      });
      return menus; //返回过滤的二维数组
    },
    permissions(): string[] {
      // 找出name控制按钮权限
      return this.menus.map(item => item.name)
    }
  }
});